// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_PPAPI_PLUGIN_BROKER_PROCESS_DISPATCHER_H_
#define CONTENT_PPAPI_PLUGIN_BROKER_PROCESS_DISPATCHER_H_

#include <stdint.h>

#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "content/child/scoped_child_process_reference.h"
#include "ppapi/c/ppp.h"
#include "ppapi/proxy/broker_dispatcher.h"
#include "ppapi/shared_impl/ppp_flash_browser_operations_shared.h"

namespace content {

// Wrapper around a BrokerDispatcher that provides the necessary integration
// for plugin process management. This class is to avoid direct dependencies
// from the PPAPI proxy on the Chrome multiprocess infrastructure.
class BrokerProcessDispatcher
    : public ppapi::proxy::BrokerSideDispatcher,
      public base::SupportsWeakPtr<BrokerProcessDispatcher> {
public:
    BrokerProcessDispatcher(PP_GetInterface_Func get_plugin_interface,
        PP_ConnectInstance_Func connect_instance,
        bool peer_is_browser);
    ~BrokerProcessDispatcher() override;

    // IPC::Listener overrides.
    bool OnMessageReceived(const IPC::Message& msg) override;

    void OnGetPermissionSettingsCompleted(
        uint32_t request_id,
        bool success,
        PP_Flash_BrowserOperations_Permission default_permission,
        const ppapi::FlashSiteSettings& sites);

private:
    void OnGetSitesWithData(uint32_t request_id,
        const base::FilePath& plugin_data_path);
    void OnClearSiteData(uint32_t request_id,
        const base::FilePath& plugin_data_path,
        const std::string& site,
        uint64_t flags,
        uint64_t max_age);
    void OnDeauthorizeContentLicenses(uint32_t request_id,
        const base::FilePath& plugin_data_path);
    void OnGetPermissionSettings(
        uint32_t request_id,
        const base::FilePath& plugin_data_path,
        PP_Flash_BrowserOperations_SettingType setting_type);
    void OnSetDefaultPermission(
        uint32_t request_id,
        const base::FilePath& plugin_data_path,
        PP_Flash_BrowserOperations_SettingType setting_type,
        PP_Flash_BrowserOperations_Permission permission,
        bool clear_site_specific);
    void OnSetSitePermission(uint32_t request_id,
        const base::FilePath& plugin_data_path,
        PP_Flash_BrowserOperations_SettingType setting_type,
        const ppapi::FlashSiteSettings& sites);

    // Returns a list of sites that have data stored.
    void GetSitesWithData(const base::FilePath& plugin_data_path,
        std::vector<std::string>* sites);

    // Requests that the plugin clear data, returning true on success.
    bool ClearSiteData(const base::FilePath& plugin_data_path,
        const std::string& site,
        uint64_t flags,
        uint64_t max_age);

    bool DeauthorizeContentLicenses(const base::FilePath& plugin_data_path);
    bool SetDefaultPermission(const base::FilePath& plugin_data_path,
        PP_Flash_BrowserOperations_SettingType setting_type,
        PP_Flash_BrowserOperations_Permission permission,
        bool clear_site_specific);
    bool SetSitePermission(const base::FilePath& plugin_data_path,
        PP_Flash_BrowserOperations_SettingType setting_type,
        const ppapi::FlashSiteSettings& sites);

    ScopedChildProcessReference process_ref_;

    PP_GetInterface_Func get_plugin_interface_;

    const PPP_Flash_BrowserOperations_1_3* flash_browser_operations_1_3_;
    const PPP_Flash_BrowserOperations_1_2* flash_browser_operations_1_2_;
    const PPP_Flash_BrowserOperations_1_0* flash_browser_operations_1_0_;

    bool peer_is_browser_;

    DISALLOW_COPY_AND_ASSIGN(BrokerProcessDispatcher);
};

} // namespace content

#endif // CONTENT_PPAPI_PLUGIN_BROKER_PROCESS_DISPATCHER_H_
